/*
 * @lc app=leetcode.cn id=59 lang=cpp
 *
 * [59] 螺旋矩阵 II
 *
 * https://leetcode-cn.com/problems/spiral-matrix-ii/description/
 *
 * algorithms
 * Medium (77.03%)
 * Likes:    629
 * Dislikes: 0
 * Total Accepted:    170.9K
 * Total Submissions: 221.9K
 * Testcase Example:  '3'
 *
 * 给你一个正整数 n ，生成一个包含 1 到 n^2 所有元素，且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
 * 
 * 
 * 
 * 示例 1：
 * 
 * 
 * 输入：n = 3
 * 输出：[[1,2,3],[8,9,4],[7,6,5]]
 * 
 * 
 * 示例 2：
 * 
 * 
 * 输入：n = 1
 * 输出：[[1]]
 * 
 * 
 * 
 * 
 * 提示：
 * 
 * 
 * 1 
 * 
 * 
 */

// @lc code=start
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        // vector<vector<int>> res(n, vector<int>(n,0)); //使用vector定义一个数组
        // int startx = 0, starty = 0; //定义每循环一个圈的起始位置
        // int loop = n / 2; //每个圈循环几次，例如3是奇数，那么loop = 1 只是循环一圈，矩阵中间的值需要单独处理
        // int mid = n / 2; //矩阵中间的位置，例如 3->（1，1） 5->(5,5) 
        // int count = 1; //用来给矩阵中的每一个元素为位置赋值 
        // int offset = 1;//每一圈循环，需要控制每一条边的长度
        // int i, j;
        // while(loop--){

        //     i = startx;
        //     j = starty;
        //     //左闭右开  上行 从左到右
        //     //j 开始的坐标是 starty, 长度是 n-offset, 因此j的末尾坐标是starty + n -offset
        //     for(j; j < starty + n - offset; j++){
        //         res[i][j] = count++;
        //     }
        //     //右行 从上到下
        //     for(i = startx; i < startx + n - offset; i++){
        //         res[i][j] = count++;
        //     }
        //     //下行 从右到左
        //     for(; j > starty; j--){
        //         res[i][j] = count++;
        //     }
        //     //左行 从下到上
        //     for(; i > startx; i--){
        //         res[i][j] = count++;
        //     }

        //     startx++;
        //     starty++;
        //     offset+=2;

        // }
        // if(n % 2) res[mid][mid] = n * n;
        // return res;

        vector<vector<int>> res(n, vector<int>(n, 0));
        int startx = 0, starty = 0;
        int loop = n / 2;
        int mid = n / 2;
        int offset = 1;
        int count = 1;
        int i, j;
        while(loop--) {
            i = startx;
            j = starty;
            for(j = starty; j < n - offset; j++) res[i][j] = count++;

            for(i = startx; i < n - offset; i++) res[i][j] = count++;

            for(; j > starty; j--) res[i][j] = count++;

            for(; i > startx; i--) res[i][j] = count++;

            startx++;
            starty++;
            offset+=2;
        }
        if(n % 2) res[mid][mid] = count;

        return res;
    }
};
// @lc code=end

